
/* ###############################################

		1. 작    성   일 	>> 	2007. 1. 28
	
		2. 파    일   명 	>> 	PSocket.cpp

 		3. 내          용 	>> 	소켓객체...
 		
 		4. 작   성    자 	>>	최철호
 		
 		5. 최종수정일	>>	2007. 1. 28
										
################################################ */

#ifndef _PSOCKET_H
#define _PSOCKET_H

#include <stdio.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <string>


using namespace std;

/* ////////////////////////////////////////////////////////////////////////

struct in_addr {
	uint32_t s_addr; // 32비트 IPv4 인터넷 주소...
}

struct sockaddr {
	sa_family_t	sin_family;
	char			sa_data[14];

struct sockaddr_in {
	sa_family_t 	sin_family; 	// 주소체계
	uint16_t 		sin_port; 	// 16bit TCP/UDP Port
	struct in_addr 	sin_addr; 	// 32bit IPv4 주소
	char 			sin_zero[8]; 	// 사용 X
}

//////////////////////////////////////////////////////////////////////// */

typedef struct in_addr InAddr;
typedef struct sockaddr SockAddr;
typedef struct sockaddr_in SockAddrIn;

class PSocket
{
public :
	PSocket( int domain, int type, int protocol );

	// Accept()의 리턴값을 이용한 생성자....
	PSocket( int retAccept );
	PSocket( const PSocket& source );
	virtual ~PSocket();

	PSocket& operator =( const PSocket& source );
	bool operator==( const PSocket& other );
	bool operator!=( const PSocket& other );

public :
	// 연결수락
	void Accept( PSocket* clientSocket );
	
	// 주소와 포트 할당...
	void Bind( sa_family_t sin_family, int port );
	
	// 소켓 종료...
	void Close();
	
	// 연결요청...
	void Connect( sa_family_t sin_family, string ipAddress, int port );
	
	// 연결요청 대기...
	void Listen( int backlog );

	// 추후정의예정...
	void Receive();
	void Send();

	// 스트림 half-close
	int ShutDown( int how );
	
	// 데이터 수신...
	int Read( void* transferMessage, size_t size );
	
	// 데이터 전송...
	int Write( void* transferMessage, size_t size );
 
	int GetSocket();
	SockAddrIn GetSocketAddress();

private :
	int socket;					// 소켓 디스크립터...
	SockAddrIn socketAddress;		// 소켓 주소정보 구조체....
	
};

inline int PSocket::GetSocket()
{
	return this->socket;
}

inline SockAddrIn PSocket::GetSocketAddress()
{
	return this->socketAddress;
}

#endif // _PSOCKET_H






